'use strict';
angular.module('hanxinBroker').directive('checkRemote', function twCheck($parse, $q) {
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function (scope, element, attrs, model) {
      var callback = $parse(attrs.checkRemote);
      if (!angular.isFunction(callback)) {
        return;
      }

      // 一段时间未再次调用后才开始检查，防止输入过程中频繁检查
      var setValidity = function (valid, message) {
        model.$setValidity('remote', valid);
        model.$remoteError = message || '';
      };
      // 初始时由于尚未检查，设置为无效状态
      setValidity(false);
      var checkIt = function() {
        var value = model.$modelValue;
        // model尚未通过其他验证(注意：不包括远端验证)时不发起远端验证
        if (_.isUndefined(value) || (model.$invalid && !model.$error.remote)) {
          setValidity(true);
          return;
        }
        setValidity(false, '正在等待服务器检查...');
        var result = callback(scope, {value: model.$modelValue, model: model});
        // 检查结果
        var checkResult = function (result) {
          if (!result) {
            setValidity(true);
          } else {
            setValidity(!result.code, result.message);
          }
        };
        $q.when(result).then(function (result) {
          checkResult(result);
        }, function (resp) {
          checkResult(resp.data);
        });
      };
      var delayedCheckIt = _.debounce(checkIt, 300);
      // 主动发起一次检查
      checkIt();
      model.$viewChangeListeners.push(function () {
        delayedCheckIt();
      });
    }
  };
});
